#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：data_reader 
@File ：DataReader.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2024/3/19 17:05 
"""

import abc
import csv
import json
import openpyxl
import sqlite3


class Reader(abc.ABC):
	"""
	定义读取器的抽象基类,所有具体的读取器都必须继承自该类并实现read方法。
	"""

	@abc.abstractmethod
	def read(self, file_path):
		pass


class CSVReader(Reader):
	def read(self, file_path):
		data = []
		with open(file_path, 'r') as file:
			reader = csv.DictReader(file)
			for row in reader:
				data.append(row)
		return data


class JSONReader(Reader):
	def read(self, file_path):
		with open(file_path, 'r') as file:
			data = json.load(file)
		return data


class ExcelReader(Reader):
	def read(self, file_path):
		"""
		实现Excel文件读取器。

		1. 使用openpyxl库打开Excel文件。
		2. 获取工作簿中的第一个工作表。
		3. 遍历工作表中的每一行,将每一行的单元格值存储在字典中。
		4. 将每一行的字典添加到列表中。
		5. 返回包含所有行数据的列表。
		"""
		workbook = openpyxl.load_workbook(file_path)
		worksheet = workbook.active
		data = []
		for row in worksheet.iter_rows(values_only=True):
			row_data = {}
			for col_idx, cell_value in enumerate(row, start=1):
				row_data[f'Column{col_idx}'] = cell_value
			data.append(row_data)
		return data


class DatabaseReader(Reader):
	def read(self, file_path):
		"""
		实现数据库读取器。

		1. 使用sqlite3库连接到SQLite数据库文件。
		2. 执行SQL查询语句,获取结果集。
		3. 将结果集中的每一行数据转换为字典。
		4. 将每一行的字典添加到列表中。
		5. 返回包含所有行数据的列表。
		"""
		conn = sqlite3.connect(file_path)
		cursor = conn.cursor()
		cursor.execute("SELECT * FROM table_name")  # 替换为实际的表名和查询语句
		data = []
		columns = [desc[0] for desc in cursor.description]
		for row in cursor.fetchall():
			row_data = dict(zip(columns, row))
			data.append(row_data)
		conn.close()
		return data


class TextReader(Reader):
	def read(self, file_path):
		"""
		实现纯文本文件读取器。

		1. 使用上下文管理器打开文件,确保文件正确关闭。
		2. 读取文件内容并按行分割。
		3. 返回包含所有行的列表。
		"""
		with open(file_path, 'r') as file:
			data = file.read().splitlines()
		return data


class DataReader:
	def __init__(self):
		self.readers = {}

	def register_reader(self, name, reader_class):
		if not issubclass(reader_class, Reader):
			raise TypeError(f"{reader_class.__name__} is not a subclass of Reader")
		self.readers[name] = reader_class

	def read_data(self, name, file_path):
		reader_class = self.readers.get(name)
		if reader_class:
			reader = reader_class()
			return reader.read(file_path)
		else:
			raise ValueError(f"No reader registered for '{name}'")


# 使用示例
reader = DataReader()
reader.register_reader('csv', CSVReader)
reader.register_reader('json', JSONReader)
reader.register_reader('excel', ExcelReader)
reader.register_reader('database', DatabaseReader)
reader.register_reader('text', TextReader)

csv_data = reader.read_data('csv', 'data.csv')
json_data = reader.read_data('json', 'data.json')
excel_data = reader.read_data('excel', 'data.xlsx')
database_data = reader.read_data('database', 'database.db')
text_data = reader.read_data('text', 'data.txt')

print("CSV Data:")
print(csv_data)

print("\nJSON Data:")
print(json_data)

print("\nExcel Data:")
print(excel_data)

print("\nDatabase Data:")
print(database_data)

print("\nText Data:")
print(text_data)
